package org.acb.sgp.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.acb.sgp.beans.Regla;
import org.acb.sgp.dao.ReglaDao;
import org.acb.sgp.factory.ConnectionFactory;

public class ReglaDaoImpl implements ReglaDao {

    private Connection con;
    private CallableStatement cs;
    private ResultSet rs;

    private Connection getConnection() throws SQLException {
        return ConnectionFactory.getInstance().getConnection();
    }

    @Override
    public void registrarRegla(Regla regla) {
        try {
            String sql = "{Call RegistrarRegla(?,?,?,?,?,?,?,?,?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, regla.getCod_base());
            cs.setString(2, regla.getStr_formula());
            cs.setString(3, regla.getStr_predicados());
            cs.setString(4, regla.getStr_objetos());
            cs.setString(5, regla.getCod_acc_registro());
            cs.setString(6, regla.getCod_acc_actualizacion());
            cs.setString(7, regla.getStr_descripcion());
            cs.setString(8, regla.getCod_estado());
            cs.setString(9, regla.getNom_base());
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(ReglaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
    }

    @Override
    public List<Regla> buscarReglas(Regla regla) {
        List<Regla> reglas = new ArrayList<Regla>();
        try {
            String sql = "{Call BuscarReglas(?,?,?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setString(1, regla.getNom_base());
            cs.setString(2, regla.getStr_descripcion());
            cs.setString(3, regla.getStr_objetos());
            rs = cs.executeQuery();
            while (rs.next()) {
            	reglas.add(llenar(rs));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ReglaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return reglas;
    }

    private Regla llenar(ResultSet rs) throws SQLException {
        Regla regla = new Regla();
        regla.setCod_base(rs.getInt("cod_base"));
        regla.setStr_formula(rs.getString("str_formula"));
        regla.setStr_predicados(rs.getString("str_predicados"));
        regla.setStr_objetos(rs.getString("str_objetos"));
        regla.setCod_acc_registro(rs.getString("cod_acc_registro"));
        regla.setCod_acc_actualizacion(rs.getString("cod_acc_actualizacion"));
        regla.setStr_descripcion(rs.getString("str_descripcion"));
        regla.setCod_estado(rs.getString("cod_estado"));        
        regla.setNom_base(rs.getString("nom_base"));
        return regla;
    }

	@Override
	public void eliminarRegla(Regla regla) {		        
        try {
            String sql = "{Call EliminarRegla(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, regla.getCod_base());            
            rs = cs.executeQuery();
        } catch (SQLException ex) {
            Logger.getLogger(ReglaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
	}

	@Override
	public List<Regla> listarTodasRegla() {
	    List<Regla> reglas = new ArrayList<Regla>();
        try {
            String sql = "{Call ListarTodasReglas()}";
            con = getConnection();
            cs = con.prepareCall(sql);
            rs = cs.executeQuery();
            while (rs.next()) {
            	reglas.add(llenar(rs));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ReglaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return reglas;
	}

    @Override
    public List<String> evaluarRegla(Regla regla) {
        List<String> lst = new ArrayList<String>();
        try {
            String sql = "{Call evaluarRegla(?)}";
            con = getConnection();
            cs = con.prepareCall(sql);
            cs.setInt(1, regla.getCod_base());   
            rs = cs.executeQuery();
            while (rs.next()) {
            	lst.add(rs.getString("resultado"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(ReglaDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            ConnectionFactory.closing(rs, cs, con);
        }
        return lst;        
    }

}
